"""定时器超时检测模块"""
"""
    该模块实现的功能主要是利用Pyqt5框架的定时器检测功能：
    1. 检测定时器是否超时
    2. 超时之后触发回调函数
"""
import threading


class TimeoutHandler:
    def __init__(self, timeout, check_time, on_timeout_callback):

        # 超时时间
        self.timeout = timeout
        # 回调函数
        self.on_timeout_callback = on_timeout_callback
        # 定时器实例对象
        self.timer = None
        # 事件对象
        self.event = threading.Event()
        # 是否正在运行
        self.running = False
        # 检查超时状态的间隔（毫秒）
        self.check_interval = check_time  # 检查超时状态的间隔（毫秒）

    def start(self):
        """
        启动定时器
        :return:
        """
        if self.running:
            return
        self.running = True
        # 重置事件
        self.event.clear()
        # 启动定时器自动轮询检测超时事件并设置回调函数
        self.timer = threading.Timer(self.timeout, self._on_timeout)
        self.timer.start()
        self._start_periodic_check()

    def _on_timeout(self):
        self.event.set()
        self.on_timeout_callback()

    def _start_periodic_check(self):
        """
        定时器轮询检测超时事件
        :return:
        """
        if self.running and not self.event.is_set():
            threading.Timer(self.check_interval / 1000, self._start_periodic_check).start()
        elif self.event.is_set():
            self.running = False
            self.timer.cancel()

    def reset(self):
        """
        重置定时器
        :return:
        """
        if self.timer is not None:
            self.timer.cancel()
        self.start()

    def stop(self):
        """
        停止定时器
        :return:
        """
        self.running = False
        if self.timer is not None:
            self.timer.cancel()


